class EventEmitter {
    constructor() {
        this.cache = {}
    }
    on(name, fn) {//为指定的事件名name注册一个回调函数fn
        if (this.cache[name]) {
            this.cache[name].push(fn)
        } else {
            this.cache[name] = [fn]
        }
    }

    // off(name, fn) {//从指定的事件名name对应的回调函数数组中移除一个回调函数fn
    //     let tasks = this.cache[name]
    //     if (tasks) {
    //         const index = tasks.findIndex(f => f === fn || f.callback === fn)
    //         if (index >= 0) {
    //             tasks.splice(index, 1)
    //         }
    //     }
    // }

    emit(name, once = false, ...args) {//触发指定的事件名name，并调用其对应的所有回调函数，同时传递额外的参数args
        if (this.cache[name]) {
            // 创建副本，如果回调函数内继续注册相同事件，会造成死循环
            for (let fn of this.cache[name]) {
                fn(...args)
            }
            if (once) {//如果once参数为true，则在触发事件后删除该事件名及其对应的回调函数数组。
                delete this.cache[name]
            }
        }
    }
}

// 测试  n 
let eventBus = new EventEmitter()
let fn1 = function(name, age) {
	console.log(`${name} ${age}`)
}
let fn2 = function(name, age) {
	console.log(`hello, ${name} ${age}`)
}
//eventBus 第三方  'aaa'自定义事件
eventBus.on('aaa', fn1)//订阅者1  
eventBus.on('aaa', fn2)//订阅者2
eventBus.emit('aaa', false, '布兰', 12)//发布者emit
// '布兰 12'
// 'hello, 布兰 12'
